Tính song song trên Hành tinh Đỏ là nghệ thuật quản lý nhiều thao tác độc lập—như điều hướng xe khám phá, truyền tín hiệu sinh học và kết nối vệ tinh—mà không làm hệ thống bị đình trệ. Trong Go, một nhiệm vụ chạy độc lập được gọi là goroutine.
1. Nguyên tắc Không xác định
Nên luôn giả định rằng các thao tác trong các goroutine khác nhau có thể chạy theo bất kỳ thứ tự nào. Vì bộ xử lý Go phân bổ công việc lên các lõi sẵn có, chúng ta không thể tin tưởng vào việc một xe khám phá hoàn thành quét dữ liệu trước khi xe khác bắt đầu gửi tín hiệu mà không có sự đồng bộ rõ ràng.
go printGopher(c) // Khởi chạy một nhiệm vụ độc lập mới
2. Cơ chế Đồng bộ
Để quản lý các tác vụ này, Go cung cấp hai công cụ chính:
- Loại trừ lẫn nhau: Các goroutine có thể sử dụng một
mutexđể loại trừ lẫn nhau khỏi việc thực hiện cùng một việc vào cùng một thời điểm. - Câu lệnh Select: Câu lệnh này giống như một câu lệnh switch, trong đó mỗi trường hợp chứa một thao tác nhận hoặc gửi qua kênh.
selectchờ cho đến khi một trường hợp sẵn sàng, rồi mới thực thi nó.
3. Khung cơ bản của người làm việc
Các tác vụ dài hạn thường sử dụng vòng lặp vô hạn kết hợp với select để theo dõi nhiều kênh truyền thông cùng lúc:
func worker() {
for {
select {
// Chờ đợi các kênh ở đây.
}
}
}
for {
select {
// Chờ đợi các kênh ở đây.
}
}
}
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>